﻿using System;
using System.IO.Ports;
using System.Windows.Forms;
using LugageTrace.Apresentacao.Properties;
using System.Text;
using System.Data; 

namespace LugageTrace.Apresentacao
{
    /// <summary>
    /// Este é o fonte do inicial do Sistema de detecção RFID. 
    /// Ele faz referencia a outras classes de windows forms responsáveis pela instacia de objetos de designer os quais não foram inclusos
    /// pois não se trata de regra de negócio.
    /// Essa classe contém métodos de busca em tabela e controle de portas com, além dos eventos de formulário
    /// 
    /// </summary>
    public partial class frmRFID : Form
    {
        private int x = 23342;
        
        #region Propriedades

        string porta = string.Empty;
        string baudrate = string.Empty;
        public StringBuilder DadosLidos = new StringBuilder();
        Modo RFIDModo;
        private DataTable tblPessoa;
        private DataTable tblMalas;
        private ModoRastreio frmModoRastreio;
        ConfigPorta objConfigPorta;

        enum Modo
        {
            Rastreio,
            ModoGravacao,
            LeituraMalas,
            LeituraPessoas,
            Parado

        }
        enum TipoCartao
        {
            CartaoMala, CartaoPessoa
        }

        enum TipoBusca
        {
            Mala, Pessoa
        }


        #endregion

        #region Construtor
        public frmRFID()
        {
            InitializeComponent();
        }

        #endregion

        #region Evento: Form_Load

        private void Form1_Load(object sender, EventArgs e)
        {
            CheckForIllegalCrossThreadCalls = false;

            Settings.Default.Context.Add("PortaSelecionada",
                                         SerialPort.GetPortNames()[SerialPort.GetPortNames().Length - 1]);
            Settings.Default.Context.Add("BaudRateSelecionado", "19200");
            statusStrip1.Items[0].Text = "Dispositivo Desconectado.";


            cadastroToolStripMenuItem.Enabled = false;


            //Criando uma tabela para simular o Banco de Dados
            tblPessoa = new DataTable();
            tblMalas = new DataTable();




            //TABELA DE PESSOAS PRE-CADASTRADAS
            tblPessoa.Columns.AddRange(
                new DataColumn[]
                    {
                        new DataColumn("IdPessoa", typeof (string)), new DataColumn("Nome", typeof (string)),
                        new DataColumn("Origem", typeof (string)), new DataColumn("Destino", typeof (string)),
                        new DataColumn("Contato", typeof (string))
                    });
            //Pessoas
            tblPessoa.Rows.Add(new object[] { "034", "Joao Paulo de Souza", "GUA", "RIO", "43353032" }); //Joao
            tblPessoa.Rows.Add(new object[] { "03", "Pedro de Almeida figueiredo", "NNY", "CNG", "43353755" }); //Pedro
            tblPessoa.Rows.Add(new object[] { "173", "Felipe Goncalves", "PRB", "RIO", "43322211" }); // Felipe
            tblPessoa.Rows.Add(new object[] { "3434", "Andre de souza Lopes", "SUL", "GUA", "32442166" }); // Andre
            tblPessoa.PrimaryKey = new DataColumn[] { tblPessoa.Columns["IdPessoa"] };






            //TABELA DE MALAS
            tblMalas.Columns.AddRange(
                new DataColumn[]{new DataColumn("IdMala", typeof (string)),new DataColumn("IdDono", typeof (string)),
                new DataColumn("Origem", typeof (string)),new DataColumn("Destino", typeof (string)),
                new DataColumn("Peso", typeof (string))});
            tblMalas.PrimaryKey = new DataColumn[] { tblMalas.Columns["IdMala"] };

            tblMalas.Rows.Add(new object[] { "1700", "034", "GUA", "RIO", "2" });
            tblMalas.Rows.Add(new object[] { "1870", "034", "GUA", "RIO", "15" });

            tblMalas.Rows.Add(new object[] { "20417", "03", "NNY", "CNG", "10" });
            tblMalas.Rows.Add(new object[] { "22117", "03", "PRB", "RIO", "3" });

            tblMalas.Rows.Add(new object[] { "23834", "173", "SUL", "GUA", "4" });

            tblMalas.Rows.Add(new object[] { "25568", "3434", "SUL", "GUA", "6" });
            tblMalas.PrimaryKey = new DataColumn[] { tblPessoa.Columns["IdMala"] };

        }

        #endregion

        #region Evento: Click MenuConectar

        private void conectarToolStripMenuItem_Click(object sender, EventArgs e)
        {
            Conectar();
        }

        #endregion

        #region Evento: click Configigurações de Porta Com
        /// <summary>
        /// Evento que instancia o form de configurações de Porta COM
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void conToolStripMenuItem_Click(object sender, EventArgs e)
        {
            objConfigPorta = new ConfigPorta();
            objConfigPorta.Show();
        }

        #endregion

        #region Evento: PortaCom_DataReceived
        /// <summary>
        /// Evento disparado quando existem dados no buffer da porta COM usada
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void PortaCom_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            //Se estiver no modo rastreio atualizar o grid com os valores da tabela
            if (RFIDModo == Modo.Rastreio)
            {
                string Dados = string.Empty;
                try
                {
                    byte[] RxBuffer = new byte[32];
                    RxBuffer.Initialize();

                    for (int i = 0; i < 4; i++)
                        RxBuffer[i] = (byte)serialPort1.ReadByte();


                    //Get Remaining data, The third byte says us how many more data is expected;
                    for (int i = 4; i < 28; i++)
                        RxBuffer[i] = (byte)serialPort1.ReadByte();

                    serialPort1.DiscardInBuffer();
                    serialPort1.DiscardOutBuffer();


                    //Chaves de busca dos dados
                    string IdMala = RxBuffer[9].ToString() + RxBuffer[10].ToString();
                    string IdPessoa = RxBuffer[11].ToString() + RxBuffer[12].ToString();

                    //Faz Busca pela mala e seu dono na tabela
                    DataRow[] Dono = BuscaDadosTabelas(TipoBusca.Pessoa, IdPessoa);

                    if (Dono.Length > 0)
                    {
                        DataRow[] Mala = BuscaDadosTabelas(TipoBusca.Mala, Dono[0]["IdPessoa"].ToString());

                        if (Mala.Length > 0)
                        {
                            for (int i = 0; i < Mala.Length; i++)
                            {


                                object[] Linha = {
                                                     Mala[i][0].ToString(), Dono[0][1].ToString(), Mala[i][4].ToString(),
                                                     DateTime.Now.ToString("dd/MM/yyyy"),
                                                     DateTime.Now.ToString("HH:mm:ss")
                                                 };
                                ((DataGridView)frmModoRastreio.Controls[0].Controls[0]).Rows.Add(Linha);
                            }
                        }
                        else
                        {
                            MessageBox.Show("Não existem Malas Cadastradas");
                        }
                    }
                
                    else
                    {
                        MessageBox.Show("Não encontrado no cadastro");
                    }


                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                    
                }

            }



        }
        #endregion

        #region Evento: rastreioToolStripMenuItem_Click
        /// <summary>
        /// Evento click. Neste evento é instanciado o form do modo rastreio
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void rastreioToolStripMenuItem_Click(object sender, EventArgs e)
        {
            if (frmModoRastreio == null)
            {

                frmModoRastreio = new ModoRastreio();
                frmModoRastreio.MdiParent = this;
                frmModoRastreio.Show();
            }


            RFIDModo = Modo.Rastreio;
        }
        #endregion
        
        #region Método: Conectar
        /// <summary>
        /// Método usado para tratamento de abertura da porta COM
        /// </summary>
        private void Conectar()
        {
            try
            {
                if (conectarToolStripMenuItem.Text == "Conectar")
                {
                    AbrePorta();
                    conectarToolStripMenuItem.Text = "Desconectar";
                    conToolStripMenuItem.Enabled = false;
                    statusStrip1.Items[0].Text = "Dispositivo Pronto para comunicação.";
                }
                else
                {
                    FecharPorta();
                    conectarToolStripMenuItem.Text = "Conectar";
                    conToolStripMenuItem.Enabled = true;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }
        #endregion

        #region Método: AbrePorta
        /// <summary>
        /// Método: Abre a Porta do micro
        /// </summary>
        void AbrePorta()
        {

            porta = Settings.Default.Context["PortaSelecionada"].ToString();
            baudrate = Settings.Default.Context["BaudRateSelecionado"].ToString();
            serialPort1.PortName = porta;
            serialPort1.BaudRate = Convert.ToInt16(baudrate);

            try
            {
                
                serialPort1.Open();
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            serialPort1.DtrEnable = true;

            serialPort1.DiscardInBuffer();
        }
        #endregion

        #region Método: FechaPorta
        /// <summary>
        /// Fecha Porta Com
        /// </summary>
        void FecharPorta()
        {
            RFIDModo = Modo.Parado;
            serialPort1.DiscardInBuffer();
            serialPort1.DiscardOutBuffer();
            serialPort1.Close();


        }
        #endregion

        #region Metodo: BuscaDadosTabelas
        /// <summary>
        /// Metodo para busca de deados na tabela
        /// </summary>
        /// <param name="Tipo">Tipo de busca</param>
        /// <param name="ID">Chave recebida do kit</param>
        /// <returns>Linha retornada pela busca</returns>
        DataRow[] BuscaDadosTabelas(TipoBusca Tipo, string ID)
        {
            DataTable tabela = new DataTable();

            if (Tipo == TipoBusca.Pessoa)
            {

                return tblPessoa.Select("IdPessoa = " + ID);
            }
            else
            {
                return tblMalas.Select("IdDono = " + ID);
            }

        }
        #endregion



      




    }
}